summaryrefslogtreecommitdiff
path: root/lib/Type/Library.pm
diff options
context:
space:
mode:
authorToby Inkster <mail@tobyinkster.co.uk>2022-09-27 21:16:31 +0100
committerToby Inkster <mail@tobyinkster.co.uk>2022-09-27 21:16:31 +0100
commit18b312d26dd320b17ae643bc336bd91bf5479e52 (patch)
treedd5ca356fe37cdcaa1480290e3da53fb1611d7d7 /lib/Type/Library.pm
parentfe739bfe9dd8738fd33271595a1c7b5b0fdda4a4 (diff)
Type::Library _remove_type method
Diffstat (limited to 'lib/Type/Library.pm')
-rw-r--r--lib/Type/Library.pm39
1 files changed, 39 insertions, 0 deletions
diff --git a/lib/Type/Library.pm b/lib/Type/Library.pm
index 0a7d1f54..9d566d73 100644
--- a/lib/Type/Library.pm
+++ b/lib/Type/Library.pm
@@ -249,6 +249,45 @@ sub add_type {
return $type;
} #/ sub add_type
+# For Type::TinyX::Facets
+sub _remove_type {
+ my $meta = shift->meta;
+ my $type = $meta->get_type( $_[0] );
+ my $class = ref $meta;
+
+ _croak( 'Type library is immutable' ) if $meta->{immutable};
+
+ delete $meta->{types}{$type->name};
+
+ no strict "refs";
+ no warnings "redefine", "prototype";
+
+ my @clean;
+ my $_scrub = sub {
+ my ( $arr, $name ) = @_;
+ @$arr = grep $_ ne $name, @$arr;
+ };
+ for my $exportable ( @{ $type->exportables } ) {
+ my $name = $exportable->{name};
+ push @clean, $name;
+ &$_scrub( \@{"$class\::EXPORT_OK"}, $name );
+ for my $t ( @{ $exportable->{tags} } ) {
+ &$_scrub( ${"$class\::EXPORT_TAGS"}{$t} ||= {}, $name );
+ }
+ delete $meta->{'functions'}{$name};
+ }
+ eval {
+ require namespace::clean;
+ 'namespace::clean'->clean_subroutines( $class, @clean );
+ };
+
+ delete 'Type::Registry'->for_class( $class )->{$type->name}
+ if $INC{'Type/Registry.pm'};
+ delete $Type::Registry::DELAYED{$class}{$type->name};
+
+ return $type;
+}
+
sub get_type {
my $meta = shift->meta;
$meta->{types}{ $_[0] };