NAME

Mock::Quick::Class - Class mocking for Mock::Quick

DESCRIPTION

Provides class mocking for Mock::Quick

SYNOPSIS

IMPLEMENT A CLASS

This 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 CLASS

This 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 ommited.

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
);

METHODS

$package = $obj->package()

Get the name of the package controlled by this object.

$bool = $obj->is_takeover()

Check if the control object was created to takeover an existing class.

$bool = $obj->is_implement()

Check if the control object was created to implement a class.

$data = $obj->metrics()

Returns a hash where keys are method names, and values are the number of times the method has been called. When a method is altered or removed the key is deleted.

$obj->override( name => sub { ... })

Override a method.

$obj->restore( $name )

Restore a method (Resets metrics)

$obj->undefine()

Undefine the package controlled by the control.

AUTHORS

Chad Granum exodist7@gmail.com
Glen Hinkle glen@empireenterprises.com

COPYRIGHT

Copyright (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.