|
NAMEMock::Quick::Class - Class mocking for Mock::Quick DESCRIPTIONProvides class mocking for Mock::Quick SYNOPSISIMPLEMENT A CLASSThis will implement a class at the namespace provided via the -implement argument. The class must not already be loaded. Once complete the real class will be prevented from loading until you call undefine() on the control object. use Mock::Quick::Class;
my $control = Mock::Quick::Class->new(
-implement => 'My::Package',
# Insert a generic new() method (blessed hash)
-with_new => 1,
# Inheritance
-subclass => 'Some::Class',
# Can also do
-subclass => [ 'Class::A', 'Class::B' ],
# generic get/set attribute methods.
-attributes => [ qw/a b c d/ ],
# Method that simply returns a value.
simple => 'value',
# Custom method.
method => sub { ... },
);
my $obj = $control->package->new;
# OR
my $obj = My::Package->new;
# Override a method
$control->override( foo => sub { ... });
# Restore it to the original
$control->restore( 'foo' );
# Remove the namespace we created, which would allow the real thing to load
# in a require or use statement.
$control->undefine();
You can also use the 'implement' method instead of new: use Mock::Quick::Class;
my $control = Mock::Quick::Class->implement(
'Some::Package',
%args
);
ANONYMOUS MOCKED CLASSThis is if you just need to generate a class where the package name does not matter. This is done when the -takeover and -implement arguments are both omitted. use Mock::Quick::Class;
my $control = Mock::Quick::Class->new(
# Insert a generic new() method (blessed hash)
-with_new => 1,
# Inheritance
-subclass => 'Some::Class',
# Can also do
-subclass => [ 'Class::A', 'Class::B' ],
# generic get/set attribute methods.
-attributes => [ qw/a b c d/ ],
# Method that simply returns a value.
simple => 'value',
# Custom method.
method => sub { ... },
);
my $obj = $control->package->new;
# Override a method
$control->override( foo => sub { ... });
# Restore it to the original
$control->restore( 'foo' );
# Remove the anonymous namespace we created.
$control->undefine();
TAKING OVER EXISTING/LOADED CLASSES use Mock::Quick::Class;
my $control = Mock::Quick::Class->takeover( 'Some::Package' );
# Override a method
$control->override( foo => sub { ... });
# Restore it to the original
$control->restore( 'foo' );
# Destroy the control object and completely restore the original class
# Some::Package.
$control = undef;
You can also do this through new() use Mock::Quick::Class;
my $control = Mock::Quick::Class->new(
-takeover => 'Some::Package',
%overrides
);
ACCESSING THE CONTROL OBJECYWhile the control object exists, it can be accessed via "YOUR::PACKAGE-"MQ_CONTROL()>. It is important to note that this method will disappear whenever the control object you track falls out of scope. Example (taken from Class.t): $obj = $CLASS->new( -takeover => 'Baz' );
$obj->override( 'foo', sub {
my $class = shift;
return "PREFIX: " . $class->MQ_CONTROL->original( 'foo' )->();
});
is( Baz->foo, "PREFIX: foo", "Override and accessed original through MQ_CONTROL" );
$obj = undef;
is( Baz->foo, 'foo', 'original' );
ok( !Baz->can('MQ_CONTROL'), "Removed control" );
METHODS
AUTHORSCOPYRIGHTCopyright (C) 2011 Chad Granum Mock-Quick is free software; Standard perl licence. Mock-Quick is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the license for more details.
|