reflectable_builder 1.1.0 copy "reflectable_builder: ^1.1.0" to clipboard
reflectable_builder: ^1.1.0 copied to clipboard

Reflection support based on code generation, using 'capabilities' to specify which operations to support, on which objects. This is the builder part of reflectable.

example/example.dart

// Copyright (c) 2018, the Dart Team. All rights reserved. Use of this
// source code is governed by a BSD-style license that can be found in
// the LICENSE file.

// Try out some reflective invocations.
// Build with `cd ..; dart run build_runner build example`.

import 'package:reflectable/reflectable.dart';
import 'example.reflectable.dart';

class MyReflectable extends Reflectable {
  const MyReflectable() : super(invokingCapability);
}

const myReflectable = MyReflectable();

@myReflectable
class A {
  int arg0() => 42;
  int arg1(int x) => x - 42;
  int arg1to3(int x, int y, [int z = 0, w]) => x + y + z * 42;
  int argNamed(int x, int y, {int z = 42}) => x + y - z;
  int operator +(int x) => 42 + x;
  int operator [](int x) => 42 + x;
  void operator []=(x, v) {
    f = x + v;
  }

  int operator -() => -f;
  int operator ~() => f + 2;

  int f = 0;

  static int noArguments() => 42;
  static int oneArgument(x) => x - 42;
  static int optionalArguments(x, y, [z = 0, w]) => x + y + z * 42;
  static int namedArguments(int x, int y, {int z = 42}) => x + y - z;
}

void main() {
  // The program execution must start run this initialization before
  // any reflective features can be used.
  initializeReflectable();

  // Get hold of a few mirrors.
  var instance = A();
  InstanceMirror instanceMirror = myReflectable.reflect(instance);
  var classMirror = myReflectable.reflectType(A) as ClassMirror;

  // Invocations of methods accepting positional arguments (printing '42').
  print(instanceMirror.invoke('arg0', []));
  print(instanceMirror.invoke('arg1', [84]));
  print(instanceMirror.invoke('arg1to3', [40, 2]));
  print(instanceMirror.invoke('arg1to3', [1, -1, 1]));
  print(instanceMirror.invoke('arg1to3', [21, 21, 0, 'foo']));

  // Invocations of methods accepting named arguments (printing '42').
  print(instanceMirror.invoke('argNamed', [55, 29]));
  print(instanceMirror.invoke('argNamed', [21, 21], {#z: 0}));

  // Invocations of operators.
  print(instanceMirror.invoke('+', [42])); // '84'.
  print(instanceMirror.invoke('[]', [42])); // '84'.
  instanceMirror.invoke('[]=', [1, 2]);
  print(instance.f); // '3'.
  print(instanceMirror.invoke('unary-', [])); // '-3'.
  print(instanceMirror.invoke('~', [])); // '5'.

  // Similar invocations on static methods (printing '42').
  print(classMirror.invoke('noArguments', []));
  print(classMirror.invoke('oneArgument', [84]));
  print(classMirror.invoke('optionalArguments', [40, 2]));
  print(classMirror.invoke('optionalArguments', [1, -1, 1]));
  print(classMirror.invoke('optionalArguments', [21, 21, 0, 'foo']));
  print(classMirror.invoke('namedArguments', [55, 29]));
  print(classMirror.invoke('namedArguments', [21, 21], {#z: 0}));
}
0
likes
130
points
488
downloads

Publisher

unverified uploader

Weekly Downloads

Reflection support based on code generation, using 'capabilities' to specify which operations to support, on which objects. This is the builder part of reflectable.

Repository (GitHub)
View/report issues

Documentation

API reference

License

BSD-3-Clause (license)

Dependencies

analyzer, build, dart_style, path, pub_semver, reflectable

More

Packages that depend on reflectable_builder