use strict; use warnings; use Test::More; my $imported; { package Foo::Bar::Baz; sub fun { 'fun' } sub met { $_[0] } package Foo::Bar::Baz::Qux; sub fun { 'fun2' } sub met { $_[0] } package Foo::Bar::Baz::SomethingElse; sub import { $imported = $_[0] } } use namespace::alias 'Foo::Bar::Baz', 'MyAlias'; use namespace::alias 'Foo::Bar::Baz'; my $x = ''; is 'MyAlias', "My${x}Alias", 'leave strings alone'; # could we hook into here? do we even want to? #use MyAlias::SomethingElse; #is $imported, 'Foo::Bar::Baz::SomethingElse', 'use of aliased package'; is MyAlias::fun(), 'fun', 'aliased function call'; is MyAlias->met(), 'Foo::Bar::Baz', 'aliased method call'; is Baz::fun(), 'fun', 'default aliased function call'; is Baz->met(), 'Foo::Bar::Baz', 'default aliased method call'; SKIP: { skip "no-paren sub calls are unaliasable on this perl", 6 unless "$]" >= 5.011002; eval q{ use namespace::alias 'Foo::Bar::Baz', 'MyAlias'; use namespace::alias 'Foo::Bar::Baz'; is MyAlias::fun, 'fun', 'aliased no-paren function call'; is Baz::fun, 'fun', 'default aliased no-paren function call'; }; is $@, ""; eval q{ use namespace::alias 'Foo::Bar::Baz', 'MyAlias'; use namespace::alias 'Foo::Bar::Baz'; my $x = MyAlias::fun 1; is $x, 'fun', 'aliased no-paren with-arg function call'; my $y = Baz::fun 1; is $y, 'fun', 'default aliased no-paren with-arg function call'; }; is $@, ""; } # might this be possible? sub giveback { $_[0] } is giveback(MyAlias), 'Foo::Bar::Baz', 'aliased bareword'; is giveback(Baz), 'Foo::Bar::Baz', 'default aliased bareword'; # sub packages is MyAlias::Qux->fun, 'fun2', 'aliased function call in sub package'; is MyAlias::Qux->met, 'Foo::Bar::Baz::Qux', 'aliased method call in sub package'; is Baz::Qux->fun, 'fun2', 'default aliased function call in sub package'; is Baz::Qux->met, 'Foo::Bar::Baz::Qux', 'default aliased method call in sub package'; # not a function, so look for package? is giveback(MyAlias::Qux), 'Foo::Bar::Baz::Qux', 'aliased sub package bareword'; is giveback(Baz::Qux), 'Foo::Bar::Baz::Qux', 'aliased sub package bareword'; # method name lookups is "string"->MyAlias::Qux::met(), 'string', 'aliased method dispatch'; is_deeply { MyAlias => 42 }, { 'MyAlias', 42 }, 'no mangling of fat commas'; is_deeply { MyAlias => 42 }, { 'MyAlias', 42 }, 'no mangling of fat commas, even not directly following the bareword'; is_deeply { MyAlias=> 42 }, { 'MyAlias', 42 }, 'another fat comma corner case'; done_testing;