diff options
author | Toby Inkster <mail@tobyinkster.co.uk> | 2022-09-27 21:16:31 +0100 |
---|---|---|
committer | Toby Inkster <mail@tobyinkster.co.uk> | 2022-09-27 21:16:31 +0100 |
commit | 18b312d26dd320b17ae643bc336bd91bf5479e52 (patch) | |
tree | dd5ca356fe37cdcaa1480290e3da53fb1611d7d7 /lib/Type/Library.pm | |
parent | fe739bfe9dd8738fd33271595a1c7b5b0fdda4a4 (diff) |
Type::Library _remove_type method
Diffstat (limited to 'lib/Type/Library.pm')
-rw-r--r-- | lib/Type/Library.pm | 39 |
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] }; |