view release on metacpan or search on metacpan
Changes for Gapp
{{$NEXT}}
- added Gapp::FileChooserButton
0.494 2012-10-25 01:00:43
0.487 2012-10-15 10:36:21
- removed print statements
- added initializer to container
- bug fix: MenuToolButton was not rendering icon attribute
- stylers now inherit from stylers applied to ancestor classes
- TreeView get_selected returns array or scalar depending on context
- TreeView coerces default column values
- content attribute of Gapp::Container widgets defaults to being lazy
- GappWidget attribute traits now defaults attribute to being ro and lazy,
typical settings for widgets, you can over-ride the defaults when defining
the attribute
- added Expander widget
0.484 2012-10-08 12:33:30
ancestry with the Form trait applied
- added trigger to "page_name" attribute of the NotebookPage trait which updates
the label of the page in the notebook when changed
- added HPaned, VPaned, Notebook attribute traits
- added action_widget attribute to notebook
- added image attribute to ImageButton
- BUG FIX: Buttons with a CodeRef as an action were not passing user args correctly
0.45.1 Aug 29 2012
- fixed bug painting ImageMenuItem widgets
0.45 Aug 29 2012
- created tag-editor example
- added mnemonic/accelerator attributes to Action objects
- added support for default widget in window
- added get_selected method to Gapp::TreeView
- added data_column
- added "name" attribute Gapp::Widget
- added "find" method to Gapp::Container
- add "toplvel" method to Gapp::Widget
0.44
- factored out Notice/NoticeBox to GappX::NoticeBox
- refactored Gapp::SimpleList to Gapp::Model::SimpleList
- factored out dialog traits to GappX::Dialogs
- factored out Gtk2 widgets to Gapp::Gtk2
- fixed bug with painters applying action callback to widget twice
- factoed out SSNEntry to GappX::SSNEntry
0.43
- add MenuToolButton, ToggleToolButton, RadioToolButton
- add RagioMenuItem, CheckMenuItem, SeparatorMenuItem, TearoffMenuItem
- Added AssistantPage trait
- Removed AssistantPage widget
- added GappXXXXX traits
- removed Notice/Noticebox (see GappX::NoticeBox)
- partial revamp of test suite
0.42
- renamed gtk_widget attribute to gobject in package Gapp::Object
0.37
- added traits for ToolItemGroup, ToolPalette
0.36
- added HPaned, VPaned, ToolItemGroup, ToolPalette
0.35
- Work with Moose 2.0+
0.34
- Fixed SeparatorMenuItem bug
0.33
- Work with Moose 1.25
- Update prerequisite requirements
0.32
- Removed dependancy on MooseX::Method::Signatures
0.31.1
attribute specified
0.28
- TreeViewColumn 'data_column' attribute now defaults to 0
- TreeViewColumn now delegates properties 'min_width' and 'resizable' to the
gtk_widget
BUG FIX:
- Layout builder for TreeViewColum was passing incorrect values to 'sort_func'
0.27
- added 'menu' attribute to Gapp::MenuItem
BUG FIX:
- fixed bug in DateEntry that called 'on_change' handler twice
0.26
- added ::StatusIcon
- added ::TimeEntry
- added ::Gtk2::TimeEntry
- added HideWindow To ::Actions::Basic
- added 'forward_page_func' property to ::Assistant
- Gapp::Gtk2::List::Simple was throwing errors if there was no content
- widgets with the FormField role threw errors when the value changed if there
was no parent widget with a Form role
0.23
- added TextView
0.22
- added FileFilter
- added SeparatorMenuItem
- added SeparatorToolItem
- added MessageDialog widget trait
- Gapp::Actions::Util now exports three new keywords: perform, parse_action, actioncb
- FileChooseDialog now has "filters" attribute
- added "clear" method to Gtk2::List::Simple
- MenuItems now have "action" attribute
- added "model" attribute to Window
0.21
- Gapp::Actions now implement MooseX::Clone
- added 'buttons' attribute to Gapp::ButtonBox
- containers now set parent attribute of child elements correctly
- added tooltips to Gapp::ToolButtons
- added GappHBox and GappVBox attribute traits
- added tooltip attribute to Gapp::Widget
0.20
- IMPORTANT: actions performed by gtk widgets are now passed the following
arguments( $gapp_widget, $user_args, $gtk_widget, @gtk_args )
- added ButtonBox, HButtonBox, VButtonBox
0.19
- added MenuBar widget
- added FileChooserDialog
- added 'create_gtk_image' method to Gapp::Action
- added 'clear' method to Gapp::Gtk2::List::Simple
- can attach actions to Gapp::ToolButton widgets
- added MenuBar widget
0.18
- added EventBox widget
- added updated attribute to Stash
- added update_from_context attribute to Stash
- added NoticeBox and Notice widgets
- added transient_for and position attributes to Window widget
0.06.1
- GtkAssistant can construct pages using a custom class in an array coercion
0.06
- added GtkAssistant trait
- added GtkAssistantPage meta-object
- added handle "destroy" to GtkDefaultWidget trait
0.05
- added GtkMenu trait
0.04.2
- added support for binding to cell renderers in GtkTreeView build functions
0.04.1
- added support for different cell renderers in GtkTreeView
0.04
- added GtkListStore trait
- added GtkTreeView trait
lib/Gapp/Actions/Form.pm
lib/Gapp/Actions/Util.pm
lib/Gapp/Assistant.pm
lib/Gapp/AssistantPage.pm
lib/Gapp/Bin.pm
lib/Gapp/Box.pm
lib/Gapp/Button.pm
lib/Gapp/ButtonBox.pm
lib/Gapp/CellRenderer.pm
lib/Gapp/CheckButton.pm
lib/Gapp/CheckMenuItem.pm
lib/Gapp/ComboBox.pm
lib/Gapp/Container.pm
lib/Gapp/DateEntry.pm
lib/Gapp/Dialog.pm
lib/Gapp/Entry.pm
lib/Gapp/EventBox.pm
lib/Gapp/Expander.pm
lib/Gapp/FileChooserButton.pm
lib/Gapp/FileChooserDialog.pm
lib/Gapp/FileFilter.pm
lib/Gapp/Gtk2.pm
lib/Gapp/Gtk2/DateEntry.pm
lib/Gapp/Gtk2/Model/List.pm
lib/Gapp/Gtk2/Model/SimpleList.pm
lib/Gapp/Gtk2/Model/Tree.pm
lib/Gapp/Gtk2/TimeEntry.pm
lib/Gapp/HBox.pm
lib/Gapp/HButtonBox.pm
lib/Gapp/HPaned.pm
lib/Gapp/Image.pm
lib/Gapp/ImageMenuItem.pm
lib/Gapp/Label.pm
lib/Gapp/Layout.pm
lib/Gapp/Layout/Default.pm
lib/Gapp/Layout/Object.pm
lib/Gapp/Layout/pod2htmd.tmp
lib/Gapp/Layout/pod2htmi.tmp
lib/Gapp/ListStore.pm
lib/Gapp/Manual.pod
lib/Gapp/Menu.pm
lib/Gapp/MenuBar.pm
lib/Gapp/MenuItem.pm
lib/Gapp/MenuShell.pm
lib/Gapp/MenuToolButton.pm
lib/Gapp/MessageDialog.pm
lib/Gapp/Meta/Attribute/Trait/DefaultWidget.pm
lib/Gapp/Meta/Widget/Native/Role/CanDefault.pm
lib/Gapp/Meta/Widget/Native/Role/FileChooser.pm
lib/Gapp/Meta/Widget/Native/Role/FormElement.pm
lib/Gapp/Meta/Widget/Native/Role/FormField.pm
lib/Gapp/Meta/Widget/Native/Role/HasAction.pm
lib/Gapp/Meta/Widget/Native/Role/HasIcon.pm
lib/Gapp/Meta/Widget/Native/Role/HasIconSize.pm
lib/Gapp/Meta/Widget/Native/Role/HasImage.pm
lib/Gapp/Meta/Widget/Native/Role/HasLabel.pm
lib/Gapp/Meta/Widget/Native/Role/HasMenu.pm
lib/Gapp/Meta/Widget/Native/Role/HasMnemonic.pm
lib/Gapp/Meta/Widget/Native/Role/HasName.pm
lib/Gapp/Meta/Widget/Native/Role/HasStockId.pm
lib/Gapp/Meta/Widget/Native/Trait/AssistantPage.pm
lib/Gapp/Meta/Widget/Native/Trait/Form.pm
lib/Gapp/Meta/Widget/Native/Trait/FromUIManager.pm
lib/Gapp/Meta/Widget/Native/Trait/ListFormField.pm
lib/Gapp/Meta/Widget/Native/Trait/NotebookPage.pm
lib/Gapp/Meta/Widget/Native/Trait/Sensitivity.pm
lib/Gapp/Meta/Widget/Native/Trait/ToggleListFormField.pm
lib/Gapp/Model/List.pm
lib/Gapp/Model/SimpleList.pm
lib/Gapp/Moose.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappActionGroup.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappAssistant.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappBox.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappButton.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappCheckButton.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappCheckMenuItem.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappComboBox.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappDateEntry.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappDefault.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappDialog.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappEntry.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappEventBox.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappExpander.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappFileChooserButton.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappFileChooserDialog.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappFileFilter.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappFrame.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappHBox.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappHButtonBox.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappHPaned.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappImage.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappImageMenuItem.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappLabel.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappListStore.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappMenu.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappMenuBar.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappMenuItem.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappMenuToolButton.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappNotebook.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappRadioMenuItem.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappRadioToolButton.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappScrolledWindow.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappSeparatorMenuItem.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappSeparatorToolItem.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappSpinButton.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappStatusIcon.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappStatusbar.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappTable.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappTearoffMenuItem.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappTextBuffer.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappTextTagTable.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappTextView.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappTimeEntry.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappToggleToolButton.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappToolButton.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappToolItemGroup.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappToolPalette.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappToolbar.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappTreeView.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappUIManager.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappVBox.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappVButtonBox.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappVPaned.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappViewport.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappWidget.pm
lib/Gapp/Moose/Meta/Attribute/Trait/GappWindow.pm
lib/Gapp/Moose/Meta/Attribute/Trait/TearoffMenuItem.pm
lib/Gapp/Moose/Role.pm
lib/Gapp/Notebook.pm
lib/Gapp/Object.pm
lib/Gapp/Paned.pm
lib/Gapp/ProgressBar.pm
lib/Gapp/RadioButton.pm
lib/Gapp/RadioMenuItem.pm
lib/Gapp/RadioToolButton.pm
lib/Gapp/ScrolledWindow.pm
lib/Gapp/SeparatorMenuItem.pm
lib/Gapp/SeparatorToolItem.pm
lib/Gapp/SpinButton.pm
lib/Gapp/StatusIcon.pm
lib/Gapp/Statusbar.pm
lib/Gapp/Table.pm
lib/Gapp/TableCell.pm
lib/Gapp/TableMap.pm
lib/Gapp/TearoffMenuItem.pm
lib/Gapp/TextBuffer.pm
lib/Gapp/TextTag.pm
lib/Gapp/TextTagTable.pm
lib/Gapp/TextView.pm
lib/Gapp/TimeEntry.pm
lib/Gapp/ToggleButton.pm
lib/Gapp/ToggleToolButton.pm
lib/Gapp/ToolButton.pm
lib/Gapp/ToolItem.pm
lib/Gapp/ToolItemGroup.pm
ex/bigexample.pl view on Meta::CPAN
);
$browser = Gapp::Window->new(
title => 'Tag Editor',
icon => 'gtk-media-play',
default_size => [ 900, 400 ],
content => [
Gapp::VBox->new(
content => [
Gapp::MenuBar->new(
content => [
Gapp::MenuItem->new(
label => 'File',
menu => Gapp::Menu->new(
content => [
Gapp::ImageMenuItem->new( action => Quit, accel_path => '<Gnumeric-Sheet>/File/Exit' ),
]
)
),
Gapp::MenuItem->new(
label => 'Edit',
menu => Gapp::Menu->new(
content => [
Gapp::ImageMenuItem->new( action => New, accel_path => '<Gnumeric-Sheet>/File/Exit' ),
Gapp::ImageMenuItem->new( action => Edit ),
Gapp::ImageMenuItem->new( action => Delete ),
]
)
),
],
expand => 0,
),
Gapp::ScrolledWindow->new(
policy => [ 'automatic', 'automatic' ],
content => [
Gapp::TreeView->new(
lib/Gapp.pm view on Meta::CPAN
use Gapp::FileChooserButton;
use Gapp::FileChooserDialog;
use Gapp::FileFilter;
use Gapp::Form::Context;
use Gapp::Form::Stash;
use Gapp::Frame;
use Gapp::HBox;
use Gapp::HPaned;
use Gapp::HButtonBox;
use Gapp::Image;
use Gapp::ImageMenuItem;
use Gapp::Label;
use Gapp::ListStore;
use Gapp::Menu;
use Gapp::MenuBar;
use Gapp::MenuItem;
use Gapp::MenuToolButton;
use Gapp::Model::List;
use Gapp::Model::SimpleList;
use Gapp::ProgressBar;
use Gapp::RadioButton;
use Gapp::ScrolledWindow;
use Gapp::SeparatorMenuItem;
use Gapp::SeparatorToolItem;
use Gapp::SpinButton;
use Gapp::Model::SimpleList;
use Gapp::Notebook;
use Gapp::Statusbar;
use Gapp::StatusIcon;
use Gapp::Table;
use Gapp::TextBuffer;
use Gapp::TextTag;
use Gapp::TextTagTable;
lib/Gapp/CheckMenuItem.pm view on Meta::CPAN
package Gapp::CheckMenuItem;
{
$Gapp::CheckMenuItem::VERSION = '0.60';
}
use Moose;
use MooseX::StrictConstructor;
use MooseX::SemiAffordanceAccessor;
extends 'Gapp::MenuItem';
with 'Gapp::Meta::Widget::Native::Role::FormField';
has '+gclass' => (
default => 'Gtk2::CheckMenuItem',
);
has 'value' => (
is => 'rw',
isa => 'Str',
default => '1',
);
lib/Gapp/CheckMenuItem.pm view on Meta::CPAN
1;
__END__
=pod
=head1 NAME
Gapp::ImageMenuItem - ImageMenuItem Widget
=head1 OBJECT HIERARCHY
=over 4
=item L<Gapp::Widget>
=item +-- L<Gapp::MenuItem>
=item ....+-- L<Gapp::CheckMenuItem>
=back
=head2 Roles
=over 4
=item L<Gapp::Meta::Widget::Native::Role::FormField>
=back
lib/Gapp/ImageMenuItem.pm view on Meta::CPAN
package Gapp::ImageMenuItem;
{
$Gapp::ImageMenuItem::VERSION = '0.60';
}
use Moose;
use MooseX::StrictConstructor;
use MooseX::SemiAffordanceAccessor;
extends 'Gapp::MenuItem';
with 'Gapp::Meta::Widget::Native::Role::HasIcon';
with 'Gapp::Meta::Widget::Native::Role::HasImage';
has '+gclass' => (
default => 'Gtk2::ImageMenuItem',
);
1;
__END__
=pod
=head1 NAME
Gapp::ImageMenuItem - ImageMenuItem Widget
=head1 OBJECT HIERARCHY
=over 4
=item L<Gapp::Widget>
=item +-- L<Gapp::MenuItem>
=item ....+-- L<Gapp::ImageMenuItem>
=back
=head2 Roles
=over 4
=item L<Gapp::Meta::Widget::Native::Role::HasIcon>
=item L<Gapp::Meta::Widget::Native::Role::HasImage>
lib/Gapp/Layout/Default.pm view on Meta::CPAN
my $gtkw = $w->gobject;
if ( $w->file ) {
$gtkw->set_from_file( $w->file );
}
elsif ( $w->stock ) {
$gtkw->set_from_stock( $w->stock->[0], $w->stock->[1] );
}
};
# ImageMenuItem
#style 'Gapp::ImageMenuItem', sub {
# my ( $l, $w ) = @_;
#
# my ( $action, @args ) = parse_action ( $w->action );
#
#
#
# if ( is_GappAction ( $action ) && $action->mnemonic ) {
#
# if ( ! $w->label && ! $w->mnemonic ) {
#
lib/Gapp/Layout/Default.pm view on Meta::CPAN
# $w->set_constructor( 'new_with_mnemonic' );
# $w->set_args( [ $action->mnemonic ] );
#
# $w->_construct_gobject;
# }
# }
#};
build 'Gapp::ImageMenuItem', sub {
my ( $l, $w ) = @_;
my $gtkw = $w->gobject;
my ( $image );
if ( $w->icon ) {
$image = Gtk2::Image->new_from_stock( $w->icon, 'menu' );
}
if ( $w->image ) {
$image = $w->image->gobject;
lib/Gapp/Layout/Default.pm view on Meta::CPAN
$gtkw->set_label( $w->label ) if defined $w->label && ! defined $w->mnemonic;
$gtkw->set_image( $image ) if defined $image;
$gtkw->set_tooltip_text( $w->tooltip ) if defined $w->tooltip;
if ( $w->menu ) {
$gtkw->set_submenu( $w->menu->gobject );
}
};
paint 'Gapp::ImageMenuItem', sub {
my ( $l, $w ) = @_;
return if ! $w->action;
#print $w, $w->mnemonic, "\n";
my ( $action, @args ) = parse_action ( $w->action );
if ( is_CodeRef $action ) {
$w->signal_connect( 'activate', $action, \@args );
}
lib/Gapp/Layout/Default.pm view on Meta::CPAN
$gtkw->set_label( $action->label ) if ! defined $w->label && ! defined $w->mnemonic && defined $action->label;
$gtkw->set_image( $action->create_gtk_image( 'menu' ) ) if ! $w->icon && ! defined $w->image && defined $action->icon;
$gtkw->set_tooltip_text( $action->tooltip ) if ! defined $w->tooltip && defined $action->tooltip;
$gtkw->signal_connect( activate => actioncb( $action, $w, \@args ) );
}
};
# MenuItem
#style 'Gapp::MenuItem', sub {
# my ( $l, $w ) = @_;
#
# my ( $action, @args ) = parse_action ( $w->action );
#
# if ( is_GappAction ( $action ) && $action->mnemonic ) {
# if ( ! $w->label && ! $w->mnemonic ) {
# $w->set_constructor( 'new_with_mnemonic' );
# $w->set_args( [ $action->mnemonic ] );
# }
# }
#};
build 'Gapp::MenuItem', sub {
my ( $l, $w ) = @_;
my $gtkw = $w->gobject;
$gtkw->set_label( $w->label ) if defined $w->label && ! defined $w->mnemonic;
$gtkw->set_tooltip_text( $w->tooltip ) if defined $w->tooltip;
if ( $w->menu ) {
$gtkw->set_submenu( $w->menu->gobject );
}
};
paint 'Gapp::MenuItem', sub {
my ( $l, $w ) = @_;
return if ! $w->action;
my ( $action, @args ) = parse_action ( $w->action );
if ( is_CodeRef $action ) {
$w->signal_connect( 'activate', $action, \@args );
}
else {
my $gtkw = $w->gobject;
$gtkw->set_label( $action->label ) if ! defined $w->label && ! defined $w->mnemonic && defined $action->label;
$gtkw->set_tooltip_text( $action->tooltip ) if ! defined $w->tooltip && defined $action->tooltip;
$gtkw->signal_connect( activate => actioncb( $action, $w, \@args ) );
}
};
add 'Gapp::MenuItem', to 'Gapp::MenuShell', sub {
my ( $l, $w, $c ) = @_;
$c->gobject->append( $w->gwrapper );
$c->gobject->show;
};
# ToolButton
style 'Gapp::MenuToolButton', sub {
my ( $l, $w ) = @_;
my $image = $w->image ?
$w->image->gobject :
Gtk2::Image->new_from_stock( $w->icon || 'gtk-dialog-error' , $w->icon_size || 'large-toolbar' );
$w->set_args( [ $image, defined $w->label ? $w->label : '' ] );
};
build 'Gapp::MenuToolButton', sub {
my ( $l, $w ) = @_;
my $gtkw = $w->gobject;
$w->gobject->set_menu( $w->menu->gobject ) if $w->menu;
$gtkw->set_stock_id( $w->stock_id ) if $w->stock_id;
$gtkw->set_label( $w->label ) if defined $w->label;
$gtkw->set_tooltip_text( $w->tooltip ) if defined $w->tooltip;
$gtkw->set_homogeneous( 1 ) if $w->homogeneous;
$w->menu->gwrapper->show_all if $w->menu;
};
paint 'Gapp::MenuToolButton', sub {
my ( $l, $w ) = @_;
return if ! $w->action;
my ( $action, @args ) = parse_action ( $w->action );
if ( is_CodeRef $action ) {
$w->signal_connect( 'clicked', $action, \@args );
}
else {
my $gtkw = $w->gobject;
lib/Gapp/Manual.pod view on Meta::CPAN
use Gapp::Actions::Basic qw( Quit );
# call directly
do_Quit;
# connect to signal
$w = Gapp::Window->new;
$w->signal_connect( 'delete-event' => Quit );
# display as menu item
Gapp::MenuItem->new( action => Quit );
# display as button
Gapp::Button->new( action => Quit );
You should see L<Gapp::Actions> for information on creating and using actions.
=head1 TRAITS
Apply traits and roles to your widgets to change their behavior!
lib/Gapp/Menu.pm view on Meta::CPAN
package Gapp::Menu;
{
$Gapp::Menu::VERSION = '0.60';
}
use Moose;
use MooseX::SemiAffordanceAccessor;
extends 'Gapp::MenuShell';
has '+gclass' => (
default => 'Gtk2::Menu',
);
1;
sub run_visible_funcs {
my ( $self ) = @_;
lib/Gapp/Menu.pm view on Meta::CPAN
$self->gobject->popup( @args );
}
__END__
=pod
=head1 NAME
Gapp::Menu - Menu Widget
=head1 OBJECT HIERARCHY
=over 4
=item L<Gapp::Object>
=item +-- L<Gapp::Widget>
=item ....+-- L<Gapp::Container>
=item ........+-- L<Gapp::MenuShell>
=item ............+-- L<Gapp::Menu>
=back
=head1 AUTHORS
Jeffrey Ray Hallock E<lt>jeffrey.hallock at gmail dot comE<gt>
=head1 COPYRIGHT & LICENSE
Copyright (c) 2011-2012 Jeffrey Ray Hallock.
lib/Gapp/MenuBar.pm view on Meta::CPAN
package Gapp::MenuBar;
{
$Gapp::MenuBar::VERSION = '0.60';
}
use Moose;
use MooseX::SemiAffordanceAccessor;
extends 'Gapp::MenuShell';
has '+gclass' => (
default => 'Gtk2::MenuBar',
);
1;
__END__
=pod
=head1 NAME
Gapp::MenuBar - MenuBar Widget
=head1 OBJECT HIERARCHY
=over 4
=item L<Gapp::Object>
=item +-- L<Gapp::Widget>
=item ....+-- L<Gapp::Container>
=item ........+-- L<Gapp::MenuShell>
=item ............+-- L<Gapp::MenuBar>
=back
=head1 AUTHORS
Jeffrey Ray Hallock E<lt>jeffrey.hallock at gmail dot comE<gt>
=head1 COPYRIGHT & LICENSE
Copyright (c) 2011-2012 Jeffrey Ray Hallock.
lib/Gapp/MenuItem.pm view on Meta::CPAN
package Gapp::MenuItem;
{
$Gapp::MenuItem::VERSION = '0.60';
}
use Moose;
use MooseX::SemiAffordanceAccessor;
extends 'Gapp::Bin';
with 'Gapp::Meta::Widget::Native::Role::HasAction';
with 'Gapp::Meta::Widget::Native::Role::HasLabel';
with 'Gapp::Meta::Widget::Native::Role::HasMenu';
with 'Gapp::Meta::Widget::Native::Role::HasMnemonic';
has '+gclass' => (
default => 'Gtk2::MenuItem',
);
has '+constructor' => (
default => 'new_with_label',
);
has '+args' => (
default => sub { [ '' ] },
);
lib/Gapp/MenuItem.pm view on Meta::CPAN
1;
__END__
=pod
=head1 NAME
Gapp::MenuItem - MenuItem Widget
=head1 OBJECT HIERARCHY
=over 4
=item L<Gapp::Object>
=item +-- L<Gapp::Widget>
=item ....+-- L<Gapp::Container>
=item ........+-- L<Gapp::Bin>
=item ............+-- L<Gapp::MenuItem>
=back
=head2 Roles
=over 4
=item L<Gapp::Meta::Widget::Native::Role::HasAction>
=item L<Gapp::Meta::Widget::Native::Role::HasLabel>
=item L<Gapp::Meta::Widget::Native::Role::HasMenu>
=back
=head1 AUTHORS
Jeffrey Ray Hallock E<lt>jeffrey.hallock at gmail dot comE<gt>
=head1 COPYRIGHT & LICENSE
Copyright (c) 2011-2012 Jeffrey Ray Hallock.
lib/Gapp/MenuShell.pm view on Meta::CPAN
package Gapp::MenuShell;
{
$Gapp::MenuShell::VERSION = '0.60';
}
use Moose;
use MooseX::SemiAffordanceAccessor;
extends 'Gapp::Container';
has '+gclass' => (
default => 'Gtk2::MenuShell',
);
1;
__END__
=pod
=head1 NAME
Gapp::MenuShell - MenuShell Widget
=head1 OBJECT HIERARCHY
=over 4
=item L<Gapp::Object>
=item +-- L<Gapp::Widget>
=item ....+-- L<Gapp::Container>
=item ........+-- L<Gapp::MenuShell>
=back
=head1 AUTHORS
Jeffrey Ray Hallock E<lt>jeffrey.hallock at gmail dot comE<gt>
=head1 COPYRIGHT & LICENSE
Copyright (c) 2011-2012 Jeffrey Ray Hallock.
lib/Gapp/MenuToolButton.pm view on Meta::CPAN
package Gapp::MenuToolButton;
{
$Gapp::MenuToolButton::VERSION = '0.60';
}
use Moose;
use MooseX::SemiAffordanceAccessor;
extends 'Gapp::ToolButton';
with 'Gapp::Meta::Widget::Native::Role::HasMenu';
has '+gclass' => (
default => 'Gtk2::MenuToolButton',
);
#after '_construct_gobject' => sub {
# my ( $self ) = @_;
# $self->gobject->set_menu( $self->menu->gobject ) if $self->menu;
#};
1;
__END__
=pod
=head1 NAME
Gapp::MenuToolButton - MenuToolButton Widget
=head1 OBJECT HIERARCHY
=over 4
=item L<Gapp::Object>
=item +-- L<Gapp::Widget>
=item ....+-- L<Gapp::ToolItem>
=item ........+-- L<Gapp::ToolButton>
=item ............+-- L<Gapp::MenuToolButton>
=back
=head2 Roles
=over 4
=item L<Gapp::Meta::Widget::Native::Role::HasMenu>
=back
=head1 AUTHORS
Jeffrey Ray Hallock E<lt>jeffrey.hallock at gmail dot comE<gt>
=head1 COPYRIGHT & LICENSE
Copyright (c) 2011-2012 Jeffrey Ray Hallock.
lib/Gapp/Meta/Widget/Native/Role/HasAction.pm view on Meta::CPAN
=head1 NAME
Gapp::Meta::Widget::Native::Role::HasAction - action attribute for widgets
=head1 SYNOPSIS
use Gapp::Actions::Basic qw( Quit );
Gapp::Button->new( action => Quit );
Gapp::ImageMenuItem->new( action => Quit );
Gapp::ToolButton->new( action => Quit );
=head1 PROVIDED ATTRIBUTES
=over 4
=item B<action>
=over 4
lib/Gapp/Meta/Widget/Native/Role/HasMenu.pm view on Meta::CPAN
package Gapp::Meta::Widget::Native::Role::HasMenu;
{
$Gapp::Meta::Widget::Native::Role::HasMenu::VERSION = '0.60';
}
use Moose::Role;
use MooseX::SemiAffordanceAccessor;
use Gapp::Types qw( MaybeGappMenu );
has 'menu' => (
is => 'rw',
isa => MaybeGappMenu,
coerce => 1,
trigger => sub {
my ( $self, $value ) = @_;
return if ! defined $value;
$value->set_parent( $self );
}
);
1;
__END__
=pod
=head1 NAME
Gapp::Meta::Widget::Native::Role::HasMenu - menu attribute for widgets
=head1 PROVIDED ATTRIBUTES
=over 4
=item B<menu>
=over 4
=item is rw
=item isa L<Gapp::Menu>|Undef
=back
The L<Gapp::Menu> assigned to the widget.
=back
=head1 AUTHORS
Jeffrey Ray Hallock E<lt>jeffrey.hallock at gmail dot comE<gt>
=head1 COPYRIGHT & LICENSE
Copyright (c) 2011-2012 Jeffrey Ray Hallock.
lib/Gapp/Moose.pm view on Meta::CPAN
use Moose;
use Moose::Meta::Method;
use Moose::Exporter;
use Gapp;
use Gapp::Gtk2;
use Gapp::Moose::Meta::Attribute::Trait::GappActionGroup;
use Gapp::Moose::Meta::Attribute::Trait::GappAssistant;
use Gapp::Moose::Meta::Attribute::Trait::GappBox;
use Gapp::Moose::Meta::Attribute::Trait::GappCheckButton;
use Gapp::Moose::Meta::Attribute::Trait::GappCheckMenuItem;
use Gapp::Moose::Meta::Attribute::Trait::GappComboBox;
use Gapp::Moose::Meta::Attribute::Trait::GappButton;
use Gapp::Moose::Meta::Attribute::Trait::GappDateEntry;
use Gapp::Moose::Meta::Attribute::Trait::GappEntry;
use Gapp::Moose::Meta::Attribute::Trait::GappExpander;
use Gapp::Moose::Meta::Attribute::Trait::GappEventBox;
use Gapp::Moose::Meta::Attribute::Trait::GappFileChooserDialog;
use Gapp::Moose::Meta::Attribute::Trait::GappFileFilter;
use Gapp::Moose::Meta::Attribute::Trait::GappFrame;
use Gapp::Moose::Meta::Attribute::Trait::GappHBox;
use Gapp::Moose::Meta::Attribute::Trait::GappHButtonBox;
use Gapp::Moose::Meta::Attribute::Trait::GappHPaned;
use Gapp::Moose::Meta::Attribute::Trait::GappVPaned;
use Gapp::Moose::Meta::Attribute::Trait::GappImage;
use Gapp::Moose::Meta::Attribute::Trait::GappLabel;
use Gapp::Moose::Meta::Attribute::Trait::GappListStore;
use Gapp::Moose::Meta::Attribute::Trait::GappDefault;
use Gapp::Moose::Meta::Attribute::Trait::GappDialog;
use Gapp::Moose::Meta::Attribute::Trait::GappMenu;
use Gapp::Moose::Meta::Attribute::Trait::GappMenuBar;
use Gapp::Moose::Meta::Attribute::Trait::GappMenuToolButton;
use Gapp::Moose::Meta::Attribute::Trait::GappNotebook;
use Gapp::Moose::Meta::Attribute::Trait::GappRadioMenuItem;
use Gapp::Moose::Meta::Attribute::Trait::GappRadioToolButton;
use Gapp::Moose::Meta::Attribute::Trait::GappScrolledWindow;
use Gapp::Moose::Meta::Attribute::Trait::GappSeparatorMenuItem;
use Gapp::Moose::Meta::Attribute::Trait::GappSeparatorToolItem;
use Gapp::Moose::Meta::Attribute::Trait::GappSpinButton;
use Gapp::Moose::Meta::Attribute::Trait::GappStatusbar;
use Gapp::Moose::Meta::Attribute::Trait::GappStatusIcon;
use Gapp::Moose::Meta::Attribute::Trait::GappTable;
use Gapp::Moose::Meta::Attribute::Trait::GappTearoffMenuItem;
use Gapp::Moose::Meta::Attribute::Trait::GappTextBuffer;
use Gapp::Moose::Meta::Attribute::Trait::GappTextTagTable;
use Gapp::Moose::Meta::Attribute::Trait::GappTextView;
use Gapp::Moose::Meta::Attribute::Trait::GappTimeEntry;
use Gapp::Moose::Meta::Attribute::Trait::GappToggleToolButton;
use Gapp::Moose::Meta::Attribute::Trait::GappToolbar;
use Gapp::Moose::Meta::Attribute::Trait::GappToolButton;
use Gapp::Moose::Meta::Attribute::Trait::GappToolItemGroup;
use Gapp::Moose::Meta::Attribute::Trait::GappToolPalette;
use Gapp::Moose::Meta::Attribute::Trait::GappTreeView;
lib/Gapp/Moose/Meta/Attribute/Trait/GappCheckMenuItem.pm view on Meta::CPAN
package Gapp::Moose::Meta::Attribute::Trait::CheckMenuItem;
{
$Gapp::Moose::Meta::Attribute::Trait::CheckMenuItem::VERSION = '0.60';
}
use Moose::Role;
before '_process_options' => sub {
my ( $class, $name, $opts ) = @_;
$opts->{gclass} = 'Gapp::CheckMenuItem' if ! exists $opts->{class};
};
package Moose::Meta::Attribute::Custom::Trait::CheckMenuItem;
{
$Moose::Meta::Attribute::Custom::Trait::CheckMenuItem::VERSION = '0.60';
}
sub register_implementation { 'Gapp::Moose::Meta::Attribute::Trait::GappCheckMenuItem' };
1;
lib/Gapp/Moose/Meta/Attribute/Trait/GappImageMenuItem.pm view on Meta::CPAN
package Gapp::Moose::Meta::Attribute::Trait::ImageMenuItem;
{
$Gapp::Moose::Meta::Attribute::Trait::ImageMenuItem::VERSION = '0.60';
}
use Moose::Role;
before '_process_options' => sub {
my ( $class, $name, $opts ) = @_;
$opts->{gclass} = 'Gapp::ImageMenuItem' if ! exists $opts->{class};
};
package Moose::Meta::Attribute::Custom::Trait::GappImageMenuItem;
{
$Moose::Meta::Attribute::Custom::Trait::GappImageMenuItem::VERSION = '0.60';
}
sub register_implementation { 'Gapp::Moose::Meta::Attribute::Trait::GappImageMenuItem' };
1;
lib/Gapp/Moose/Meta/Attribute/Trait/GappMenu.pm view on Meta::CPAN
package Gapp::Moose::Meta::Attribute::Trait::GappMenu;
{
$Gapp::Moose::Meta::Attribute::Trait::GappMenu::VERSION = '0.60';
}
use Moose::Role;
before '_process_options' => sub {
my ( $class, $name, $opts ) = @_;
$opts->{gclass} = 'Gapp::Menu' if ! exists $opts->{class};
};
package Moose::Meta::Attribute::Custom::Trait::GappMenu;
{
$Moose::Meta::Attribute::Custom::Trait::GappMenu::VERSION = '0.60';
}
sub register_implementation { 'Gapp::Moose::Meta::Attribute::Trait::GappMenu' };
1;
lib/Gapp/Moose/Meta/Attribute/Trait/GappMenuBar.pm view on Meta::CPAN
package Gapp::Moose::Meta::Attribute::Trait::GappMenuBar;
{
$Gapp::Moose::Meta::Attribute::Trait::GappMenuBar::VERSION = '0.60';
}
use Moose::Role;
before '_process_options' => sub {
my ( $class, $name, $opts ) = @_;
$opts->{gclass} = 'Gapp::MenuBar' if ! exists $opts->{class};
};
package Moose::Meta::Attribute::Custom::Trait::GappMenuBar;
{
$Moose::Meta::Attribute::Custom::Trait::GappMenuBar::VERSION = '0.60';
}
sub register_implementation { 'Gapp::Moose::Meta::Attribute::Trait::GappMenuBar' };
1;
lib/Gapp/Moose/Meta/Attribute/Trait/GappMenuItem.pm view on Meta::CPAN
package Gapp::Moose::Meta::Attribute::Trait::MenuItem;
{
$Gapp::Moose::Meta::Attribute::Trait::MenuItem::VERSION = '0.60';
}
use Moose::Role;
before '_process_options' => sub {
my ( $class, $name, $opts ) = @_;
$opts->{gclass} = 'Gapp::MenuItem' if ! exists $opts->{class};
};
package Moose::Meta::Attribute::Custom::Trait::GappMenuItem;
{
$Moose::Meta::Attribute::Custom::Trait::GappMenuItem::VERSION = '0.60';
}
sub register_implementation { 'Gapp::Moose::Meta::Attribute::Trait::GappMenuItem' };
1;
lib/Gapp/Moose/Meta/Attribute/Trait/GappMenuToolButton.pm view on Meta::CPAN
package Gapp::Moose::Meta::Attribute::Trait::GappMenuToolButton;
{
$Gapp::Moose::Meta::Attribute::Trait::GappMenuToolButton::VERSION = '0.60';
}
use Moose::Role;
before '_process_options' => sub {
my ( $class, $name, $opts ) = @_;
$opts->{gclass} = 'Gapp::MenuToolButton' if ! exists $opts->{class};
};
package Moose::Meta::Attribute::Custom::Trait::GappMenuToolButton;
{
$Moose::Meta::Attribute::Custom::Trait::GappMenuToolButton::VERSION = '0.60';
}
sub register_implementation { 'Gapp::Moose::Meta::Attribute::Trait::GappMenuToolButton' };
1;
lib/Gapp/Moose/Meta/Attribute/Trait/GappRadioMenuItem.pm view on Meta::CPAN
package Gapp::Moose::Meta::Attribute::Trait::RadioMenuItem;
{
$Gapp::Moose::Meta::Attribute::Trait::RadioMenuItem::VERSION = '0.60';
}
use Moose::Role;
before '_process_options' => sub {
my ( $class, $name, $opts ) = @_;
$opts->{gclass} = 'Gapp::RadioMenuItem' if ! exists $opts->{class};
};
package Moose::Meta::Attribute::Custom::Trait::RadioMenuItem;
{
$Moose::Meta::Attribute::Custom::Trait::RadioMenuItem::VERSION = '0.60';
}
sub register_implementation { 'Gapp::Moose::Meta::Attribute::Trait::GappRadioMenuItem' };
1;
lib/Gapp/Moose/Meta/Attribute/Trait/GappSeparatorMenuItem.pm view on Meta::CPAN
package Gapp::Moose::Meta::Attribute::Trait::SeparatorMenuItem;
{
$Gapp::Moose::Meta::Attribute::Trait::SeparatorMenuItem::VERSION = '0.60';
}
use Moose::Role;
before '_process_options' => sub {
my ( $class, $name, $opts ) = @_;
$opts->{gclass} = 'Gapp::SeparatorMenuItem' if ! exists $opts->{class};
};
package Moose::Meta::Attribute::Custom::Trait::GappSeparatorMenuItem;
{
$Moose::Meta::Attribute::Custom::Trait::GappSeparatorMenuItem::VERSION = '0.60';
}
sub register_implementation { 'Gapp::Moose::Meta::Attribute::Trait::GappSeparatorMenuItem' };
1;
lib/Gapp/Moose/Meta/Attribute/Trait/GappTearoffMenuItem.pm view on Meta::CPAN
package Gapp::Moose::Meta::Attribute::Trait::TearoffMenuItem;
{
$Gapp::Moose::Meta::Attribute::Trait::TearoffMenuItem::VERSION = '0.60';
}
{
$Gapp::Moose::Meta::Attribute::Trait::TearoffMenuItem::VERSION = '0.60';
}
use Moose::Role;
before '_process_options' => sub {
my ( $class, $name, $opts ) = @_;
$opts->{gclass} = 'Gapp::TearoffMenuItem' if ! exists $opts->{class};
};
package Moose::Meta::Attribute::Custom::Trait::GappTearoffMenuItem;
{
$Moose::Meta::Attribute::Custom::Trait::GappTearoffMenuItem::VERSION = '0.60';
}
{
$Moose::Meta::Attribute::Custom::Trait::GappTearoffMenuItem::VERSION = '0.60';
}
sub register_implementation { 'Gapp::Moose::Meta::Attribute::Trait::GappTearoffMenuItem' };
1;
lib/Gapp/Moose/Meta/Attribute/Trait/TearoffMenuItem.pm view on Meta::CPAN
package Gapp::Moose::Meta::Attribute::Trait::TearoffMenuItem;
{
$Gapp::Moose::Meta::Attribute::Trait::TearoffMenuItem::VERSION = '0.60';
}
use Moose::Role;
before '_process_options' => sub {
my ( $class, $name, $opts ) = @_;
$opts->{gclass} = 'Gapp::TearoffMenuItem' if ! exists $opts->{class};
};
package Moose::Meta::Attribute::Custom::Trait::GappTearoffMenuItem;
{
$Moose::Meta::Attribute::Custom::Trait::GappTearoffMenuItem::VERSION = '0.60';
}
sub register_implementation { 'Gapp::Moose::Meta::Attribute::Trait::GappTearoffMenuItem' };
1;
lib/Gapp/Moose/Role.pm view on Meta::CPAN
use Gapp::Moose::Meta::Attribute::Trait::GappFileChooserDialog;
use Gapp::Moose::Meta::Attribute::Trait::GappFileFilter;
use Gapp::Moose::Meta::Attribute::Trait::GappFrame;
use Gapp::Moose::Meta::Attribute::Trait::GappHBox;
use Gapp::Moose::Meta::Attribute::Trait::GappHButtonBox;
use Gapp::Moose::Meta::Attribute::Trait::GappImage;
use Gapp::Moose::Meta::Attribute::Trait::GappLabel;
use Gapp::Moose::Meta::Attribute::Trait::GappListStore;
use Gapp::Moose::Meta::Attribute::Trait::GappDefault;
use Gapp::Moose::Meta::Attribute::Trait::GappDialog;
use Gapp::Moose::Meta::Attribute::Trait::GappMenu;
use Gapp::Moose::Meta::Attribute::Trait::GappMenuBar;
use Gapp::Moose::Meta::Attribute::Trait::GappScrolledWindow;
use Gapp::Moose::Meta::Attribute::Trait::GappSpinButton;
use Gapp::Moose::Meta::Attribute::Trait::GappStatusIcon;
use Gapp::Moose::Meta::Attribute::Trait::GappTable;
use Gapp::Moose::Meta::Attribute::Trait::GappTextView;
use Gapp::Moose::Meta::Attribute::Trait::GappTimeEntry;
use Gapp::Moose::Meta::Attribute::Trait::GappToolbar;
use Gapp::Moose::Meta::Attribute::Trait::GappTreeView;
use Gapp::Moose::Meta::Attribute::Trait::GappUIManager;
use Gapp::Moose::Meta::Attribute::Trait::GappWindow;
lib/Gapp/RadioMenuItem.pm view on Meta::CPAN
package Gapp::RadioMenuItem;
{
$Gapp::RadioMenuItem::VERSION = '0.60';
}
use Moose;
use MooseX::StrictConstructor;
use MooseX::SemiAffordanceAccessor;
extends 'Gapp::CheckMenuItem';
with 'Gapp::Meta::Widget::Native::Role::FormField';
has '+gclass' => (
default => 'Gtk2::RadioMenuItem',
);
has 'value' => (
is => 'rw',
isa => 'Str',
default => '1',
);
lib/Gapp/RadioMenuItem.pm view on Meta::CPAN
1;
__END__
=pod
=head1 NAME
Gapp::ImageMenuItem - ImageMenuItem Widget
=head1 OBJECT HIERARCHY
=over 4
=item L<Gapp::Widget>
=item +-- L<Gapp::MenuItem>
=item ....+-- L<Gapp::ImageMenuItem>
=back
=head2 Roles
=over 4
=item L<Gapp::Meta::Widget::Native::Role::HasIcon>
=item L<Gapp::Meta::Widget::Native::Role::HasImage>
lib/Gapp/SeparatorMenuItem.pm view on Meta::CPAN
package Gapp::SeparatorMenuItem;
{
$Gapp::SeparatorMenuItem::VERSION = '0.60';
}
use Moose;
use MooseX::SemiAffordanceAccessor;
extends 'Gapp::MenuItem';
has '+gclass' => (
default => 'Gtk2::SeparatorMenuItem',
);
has '+constructor' => (
default => 'new',
);
has '+args' => (
default => undef,
);
lib/Gapp/SeparatorMenuItem.pm view on Meta::CPAN
1;
__END__
=pod
=head1 NAME
Gapp::SeparatorMenuItem - SeparatorMenuItem Widget
=head1 OBJECT HIERARCHY
=over 4
=item L<Gapp::Object>
=item +-- L<Gapp::Widget>
=item ....+-- L<Gapp::MenuItem>
=item ........+-- L<Gapp::SeparatorMenuItem>
=back
=head1 AUTHORS
Jeffrey Ray Hallock E<lt>jeffrey.hallock at gmail dot comE<gt>
=head1 COPYRIGHT & LICENSE
Copyright (c) 2011-2012 Jeffrey Ray Hallock.
lib/Gapp/TearoffMenuItem.pm view on Meta::CPAN
package Gapp::TearoffMenuItem;
{
$Gapp::TearoffMenuItem::VERSION = '0.60';
}
use Moose;
use MooseX::SemiAffordanceAccessor;
extends 'Gapp::MenuItem';
has '+gclass' => (
default => 'Gtk2::TearoffMenuItem',
);
has '+constructor' => (
default => 'new',
);
has '+args' => (
default => sub { [ ] },
);
1;
__END__
=pod
=head1 NAME
Gapp::MenuItem - MenuItem Widget
=head1 OBJECT HIERARCHY
=over 4
=item L<Gapp::Object>
=item +-- L<Gapp::Widget>
=item ....+-- L<Gapp::Container>
=item ........+-- L<Gapp::Bin>
=item ............+-- L<Gapp::MenuItem>
=item ................+-- Gapp::TearoffMenuItem
=back
=head1 AUTHORS
Jeffrey Ray Hallock E<lt>jeffrey.hallock at gmail dot comE<gt>
=head1 COPYRIGHT & LICENSE