[perl-Glib-Object-Introspection] Add support for flattening array ref returns
- From: Torsten SchÃnfeld <tsch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [perl-Glib-Object-Introspection] Add support for flattening array ref returns
- Date: Sat, 10 Sep 2011 21:39:16 +0000 (UTC)
commit eaa29e5fcecbc0546e2ec6a9d0266be7c8c3ca6f
Author: Torsten SchÃnfeld <kaffeetisch gmx de>
Date: Sat Sep 10 22:01:14 2011 +0200
Add support for flattening array ref returns
lib/Glib/Object/Introspection.pm | 45 +++++++++++++++++++++++++++++++------
1 files changed, 37 insertions(+), 8 deletions(-)
---
diff --git a/lib/Glib/Object/Introspection.pm b/lib/Glib/Object/Introspection.pm
index 4facae6..4f925a2 100644
--- a/lib/Glib/Object/Introspection.pm
+++ b/lib/Glib/Object/Introspection.pm
@@ -28,6 +28,23 @@ $Carp::Internal{(__PACKAGE__)}++;
require XSLoader;
XSLoader::load(__PACKAGE__, $VERSION);
+sub _create_invoker_sub {
+ my ($basename, $namespace, $name,
+ $shift_package_name, $flatten_array_ref_return) = @_;
+ if ($flatten_array_ref_return) {
+ return sub {
+ shift if $shift_package_name;
+ my $ref = __PACKAGE__->invoke($basename, $namespace, $name, @_);
+ return wantarray ? @$ref : $ref->[$#$ref];
+ };
+ } else {
+ return sub {
+ shift if $shift_package_name;
+ return __PACKAGE__->invoke($basename, $namespace, $name, @_);
+ };
+ }
+}
+
sub setup {
my ($class, %params) = @_;
my $basename = $params{basename};
@@ -36,8 +53,11 @@ sub setup {
my $search_path = $params{search_path} || undef;
my $name_corrections = $params{name_corrections} || {};
my $class_static_methods = $params{class_static_methods} || [];
+ my $flatten_array_ref_return_for_list =
+ $params{flatten_array_ref_return_for} || [];
my %shift_package_name_for = map { $_ => 1 } @$class_static_methods;
+ my %flatten_array_ref_return_for = map { $_ => 1 } @$flatten_array_ref_return_for_list;
__PACKAGE__->_load_library($basename, $version, $search_path);
@@ -60,13 +80,10 @@ sub setup {
if (defined *{$corrected_name}) {
next NAME;
}
- *{$corrected_name} = sub {
- shift if $shift_package_name_for{$corrected_name};
- __PACKAGE__->invoke($basename,
- $is_namespaced ? $namespace : undef,
- $name,
- @_);
- };
+ *{$corrected_name} = _create_invoker_sub (
+ $basename, $is_namespaced ? $namespace : undef, $name,
+ $shift_package_name_for{$corrected_name},
+ $flatten_array_ref_return_for{$corrected_name});
}
}
@@ -182,7 +199,7 @@ C<Glib::IO::file_hash> but you want C<Glib::IO::File::hash> then pass
'Glib::IO::file_hash' => 'Glib::IO::File::hash'
}
-=item class_static_methods => [ functions1, ... ]
+=item class_static_methods => [ function1, ... ]
An array ref of function names that you want to be treated as class-static
methods. That is, if you want be able to call
@@ -195,6 +212,18 @@ pass
The function names refer to those after name corrections.
+=item flatten_array_ref_return_for => [ function1, ... ]
+
+An array ref of function names that return an array ref that you want to be
+flattened so that they return plain lists. For example
+
+ flatten_array_ref_return_for => [
+ 'Gtk3::Window::list_toplevels'
+ ]
+
+The function names refer to those after name corrections. Functions occuring
+in C<flatten_array_ref_return_for> may also occur in C<class_static_methods>.
+
=back
=head2 C<< Glib::Object::Introspection->invoke >>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]