Snippets

Daniel Zollinger Different ways to decorate CredentialRequest

Created by Daniel Zollinger
// What we'd like to do:
class CredentialRequestStateful extends CredentialRequest {
  RequestStatus status = RequestStatus.pending; 
}
// And then down-cast our returned list to be the subclass
data: res.data?.map((r) => r as CredentialRequestStateful)
// This doesn't work in Dart's type system. This might be a good thing.

// This makes an explicit copy of the decorated class's attributes.
// ## Pros: ##
// - Short
// ## Cons: ##
// - If the decorated instance changes this won't be reflected in this object
// - If a new field is added to decorated it won't be available without extending
//   our decorator
class CredentialRequestStateful extends CredentialRequest {
  RequestStatus status = RequestStatus.pending;

  CredentialRequestStateful.fromBase(CredentialRequest r) {
    id = r.id;
    schemaId = r.schemaId;
    connectionId = r.connectionId;
    definitionId = r.definitionId;
    attributeValues = r.attributeValues;
  }
}

// Use `noSuchMethod` and reflection to pass any un-overriden fields or methods to
// the decorated instance.
// ## Pros: ##
// - Does exactly what a decorator should do.
// - Handles any changes to the decorated interface
// ## Cons: ##
// - Not available on web or mobile. Sigh
class CredentialRequestStateful implements CredentialRequest {
  RequestStatus status = RequestStatus.pending;

  final CredentialRequest request;

  CredentialRequestStateful.fromBase(this.request);

  dynamic noSuchMethod(Invocation invocation) {
    var im = reflect(request);
    return im.delegate(invocation);
  }
}

// Explicitly proxy methods to our decorated instance
//
// ## Pros: ##
// - Because we treat the decorated as the interface, we'll get an error if we don't
//   implement all of its public methods/fields.
// - Very explicit
// ## Cons: ##
// - OMG SO WORDY
// - Still need to manually extend.
class CredentialRequestStateful implements CredentialRequest {
  RequestStatus status = RequestStatus.pending;

  final CredentialRequest request;

  CredentialRequestStateful.fromBase(this.request);

  @override
  Map<String, String> get attributeValues => request.attributeValues;

  @override
  set attributeValues(Map<String, String> attributeValues) {
    request.attributeValues = attributeValues;
  }

  @override
  String get connectionId => request.connectionId;

  @override
  set connectionId(String connectionId) {
    request.connectionId = connectionId;
  }

  @override
  String get definitionId => request.definitionId;

  @override
  set definitionId(String definitionId) {
    request.definitionId = definitionId;
  }

  @override
  String get id => request.id;

  @override
  set id(String id) {
    request.id = id;
  }

  @override
  String get schemaId => request.schemaId;

  @override
  set schemaId(String schemaId) {
    request.schemaId = schemaId;
  }

  @override
  Map<String, dynamic> toJson() => request.toJson();
}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.