Java 8 Functional Programming - Need to write a generic function on classJava inner class and static nested classDoes functional programming replace GoF design patterns?How do I generate random integers within a specific range in Java?How to create a generic array in Java?What is (functional) reactive programming?Functional programming vs Object Oriented programmingHow do I create a file and write to it in Java?How can a time function exist in functional programming?Static Classes In JavaWhat is the difference between canonical name, simple name and class name in Java Class?
How do I extract a value from a time formatted value in excel?
Would this custom Sorcerer variant that can only learn any verbal-component-only spell be unbalanced?
Sequence of Tenses: Translating the subjunctive
Why Were Madagascar and New Zealand Discovered So Late?
Term for the "extreme-extension" version of a straw man fallacy?
Return the Closest Prime Number
How does Loki do this?
Is there a problem with hiding "forgot password" until it's needed?
Why escape if the_content isnt?
Is a stroke of luck acceptable after a series of unfavorable events?
Valid Badminton Score?
A Rare Riley Riddle
Do the temporary hit points from the Battlerager barbarian's Reckless Abandon stack if I make multiple attacks on my turn?
Failed to fetch jessie backports repository
A problem in Probability theory
Is the destination of a commercial flight important for the pilot?
What is the opposite of 'gravitas'?
What can we do to stop prior company from asking us questions?
Do sorcerers' Subtle Spells require a skill check to be unseen?
Is there a korbon needed for conversion?
Replace character with another only if repeated and not part of a word
How to be diplomatic in refusing to write code that breaches the privacy of our users
How does the UK government determine the size of a mandate?
Applicability of Single Responsibility Principle
Java 8 Functional Programming - Need to write a generic function on class
Java inner class and static nested classDoes functional programming replace GoF design patterns?How do I generate random integers within a specific range in Java?How to create a generic array in Java?What is (functional) reactive programming?Functional programming vs Object Oriented programmingHow do I create a file and write to it in Java?How can a time function exist in functional programming?Static Classes In JavaWhat is the difference between canonical name, simple name and class name in Java Class?
I want to create a method that accepts something like this
set(nodeStatus, status, NodeStatus::setStatus, Status::valueOf);
set(nodeStatus, errorCode, NodeStatus::setErrorCode, ErrorCode::valueOf);
Status and ErrorCode are enums in java.
Signature and pseudocode
set(NodeStatus nodeStatus, byte[] status, ?nodeStatusOperator , ?ValueTransformer)
1. convert byte[] status to appropriate value as per ValueTransformer
2. nodeStatusOperator sets this transformed value according to the lambda passed.
I want to know what method signature should be used to accompalish this in java and why. I tried various Consumers, BiConsumers etc but couldnt do this. Can anyone please help?
java lambda functional-programming producer-consumer
add a comment |
I want to create a method that accepts something like this
set(nodeStatus, status, NodeStatus::setStatus, Status::valueOf);
set(nodeStatus, errorCode, NodeStatus::setErrorCode, ErrorCode::valueOf);
Status and ErrorCode are enums in java.
Signature and pseudocode
set(NodeStatus nodeStatus, byte[] status, ?nodeStatusOperator , ?ValueTransformer)
1. convert byte[] status to appropriate value as per ValueTransformer
2. nodeStatusOperator sets this transformed value according to the lambda passed.
I want to know what method signature should be used to accompalish this in java and why. I tried various Consumers, BiConsumers etc but couldnt do this. Can anyone please help?
java lambda functional-programming producer-consumer
add a comment |
I want to create a method that accepts something like this
set(nodeStatus, status, NodeStatus::setStatus, Status::valueOf);
set(nodeStatus, errorCode, NodeStatus::setErrorCode, ErrorCode::valueOf);
Status and ErrorCode are enums in java.
Signature and pseudocode
set(NodeStatus nodeStatus, byte[] status, ?nodeStatusOperator , ?ValueTransformer)
1. convert byte[] status to appropriate value as per ValueTransformer
2. nodeStatusOperator sets this transformed value according to the lambda passed.
I want to know what method signature should be used to accompalish this in java and why. I tried various Consumers, BiConsumers etc but couldnt do this. Can anyone please help?
java lambda functional-programming producer-consumer
I want to create a method that accepts something like this
set(nodeStatus, status, NodeStatus::setStatus, Status::valueOf);
set(nodeStatus, errorCode, NodeStatus::setErrorCode, ErrorCode::valueOf);
Status and ErrorCode are enums in java.
Signature and pseudocode
set(NodeStatus nodeStatus, byte[] status, ?nodeStatusOperator , ?ValueTransformer)
1. convert byte[] status to appropriate value as per ValueTransformer
2. nodeStatusOperator sets this transformed value according to the lambda passed.
I want to know what method signature should be used to accompalish this in java and why. I tried various Consumers, BiConsumers etc but couldnt do this. Can anyone please help?
java lambda functional-programming producer-consumer
java lambda functional-programming producer-consumer
asked Mar 7 at 13:09
Nishant LakharaNishant Lakhara
95131036
95131036
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
As far as I can tell, what you need is this:
public <T> void set (NodeStatus nodeStatus,
byte [] value,
BiConsumer<NodeStatus,T> setter,
Function<byte[],T> transformer)
T transformedValue = transformer.apply(value);
setter.accept(nodeStatus, transformedValue);
(If value
can be something other than byte[]
, you can replace it with another type parameter.)
P.s.: setter
is a BiConsumer
, because you use a static method reference (e.g. NodeStatus::setErrorCode
) on an instance method, so the first argument of BiConsumer
has to be the NodeStatus
instance setErrorCode()
will be called on.
P.p.s: As pointed out by glglgl, you can potentially simplify your code to this:
public <T> void set (byte [] value,
Consumer<T> setter,
Function<byte[],T> transformer)
T transformedValue = transformer.apply(value);
setter.accept(transformedValue);
And call it like this:
set(status, nodeStatus::setStatus, Status::valueOf);
...where nodeStatus
is the instance of NodeStatus
you want to manipulate.
2
OP didn't specify if that's allowed for him, but if so, I'd refine this topublic <T> void set (byte [] value, Consumer<T> setter, Function<byte[],T> transformer) T transformedValue = transformer.apply(value); setter.accept(transformedValue);
, including the status object into the setter method reference. The calls then be likeset(status, nodeStatus::setStatus, Status::valueOf); set(errorCode, nodeStatus::setErrorCode, ErrorCode::valueOf);
– glglgl
Mar 7 at 13:20
2
@glglgl You're absolutely right, that would look a lot cleaner. I just went with the signature OP provided, but I'll edit my answer.
– biziclop
Mar 7 at 13:22
Thanks everyone - Such a quick response and excellent use of generics
– Nishant Lakhara
Mar 7 at 13:52
add a comment |
It's a little unclear what you're trying to achieve. Why pass the NodeStatus and the function when you could just pass a function that works on that specific NodeStatus instance, e.g.:
static <T> void set(byte[] status, Consumer<T> nodeStatusOperator, Function<String, T> transformer)
nodeStatusOperator.accept(transformer.apply(new String(status)));
public static void main(String[] args)
NodeStatus nodeStatus = new NodeStatus();
byte[] status = new byte[0];
set(status, nodeStatus::setStatus, Status::valueOf);
set(status, nodeStatus::setErrorCode, ErrorCode::valueOf);
And what does that genericity buy you over a more straightforward approach?
nodeStatus.setStatus(Status.valueOf(new String(status)));
nodeStatus.setErrorCode(ErrorCode.valueOf(new String(status)));
new String(status) is common for all Enums. Similarly in my class there are multiple other setters like Date where conversion is different. Also there are string setters. Moreover I can apply some general checks on the transformed value for multiple setters of same type and thus reduce line of code. Example: nodeStatus.setUpdateTs(new Date(BinaryUtils.bytesToLong(updateTs))
– Nishant Lakhara
Mar 7 at 13:56
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55044589%2fjava-8-functional-programming-need-to-write-a-generic-function-on-class%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
As far as I can tell, what you need is this:
public <T> void set (NodeStatus nodeStatus,
byte [] value,
BiConsumer<NodeStatus,T> setter,
Function<byte[],T> transformer)
T transformedValue = transformer.apply(value);
setter.accept(nodeStatus, transformedValue);
(If value
can be something other than byte[]
, you can replace it with another type parameter.)
P.s.: setter
is a BiConsumer
, because you use a static method reference (e.g. NodeStatus::setErrorCode
) on an instance method, so the first argument of BiConsumer
has to be the NodeStatus
instance setErrorCode()
will be called on.
P.p.s: As pointed out by glglgl, you can potentially simplify your code to this:
public <T> void set (byte [] value,
Consumer<T> setter,
Function<byte[],T> transformer)
T transformedValue = transformer.apply(value);
setter.accept(transformedValue);
And call it like this:
set(status, nodeStatus::setStatus, Status::valueOf);
...where nodeStatus
is the instance of NodeStatus
you want to manipulate.
2
OP didn't specify if that's allowed for him, but if so, I'd refine this topublic <T> void set (byte [] value, Consumer<T> setter, Function<byte[],T> transformer) T transformedValue = transformer.apply(value); setter.accept(transformedValue);
, including the status object into the setter method reference. The calls then be likeset(status, nodeStatus::setStatus, Status::valueOf); set(errorCode, nodeStatus::setErrorCode, ErrorCode::valueOf);
– glglgl
Mar 7 at 13:20
2
@glglgl You're absolutely right, that would look a lot cleaner. I just went with the signature OP provided, but I'll edit my answer.
– biziclop
Mar 7 at 13:22
Thanks everyone - Such a quick response and excellent use of generics
– Nishant Lakhara
Mar 7 at 13:52
add a comment |
As far as I can tell, what you need is this:
public <T> void set (NodeStatus nodeStatus,
byte [] value,
BiConsumer<NodeStatus,T> setter,
Function<byte[],T> transformer)
T transformedValue = transformer.apply(value);
setter.accept(nodeStatus, transformedValue);
(If value
can be something other than byte[]
, you can replace it with another type parameter.)
P.s.: setter
is a BiConsumer
, because you use a static method reference (e.g. NodeStatus::setErrorCode
) on an instance method, so the first argument of BiConsumer
has to be the NodeStatus
instance setErrorCode()
will be called on.
P.p.s: As pointed out by glglgl, you can potentially simplify your code to this:
public <T> void set (byte [] value,
Consumer<T> setter,
Function<byte[],T> transformer)
T transformedValue = transformer.apply(value);
setter.accept(transformedValue);
And call it like this:
set(status, nodeStatus::setStatus, Status::valueOf);
...where nodeStatus
is the instance of NodeStatus
you want to manipulate.
2
OP didn't specify if that's allowed for him, but if so, I'd refine this topublic <T> void set (byte [] value, Consumer<T> setter, Function<byte[],T> transformer) T transformedValue = transformer.apply(value); setter.accept(transformedValue);
, including the status object into the setter method reference. The calls then be likeset(status, nodeStatus::setStatus, Status::valueOf); set(errorCode, nodeStatus::setErrorCode, ErrorCode::valueOf);
– glglgl
Mar 7 at 13:20
2
@glglgl You're absolutely right, that would look a lot cleaner. I just went with the signature OP provided, but I'll edit my answer.
– biziclop
Mar 7 at 13:22
Thanks everyone - Such a quick response and excellent use of generics
– Nishant Lakhara
Mar 7 at 13:52
add a comment |
As far as I can tell, what you need is this:
public <T> void set (NodeStatus nodeStatus,
byte [] value,
BiConsumer<NodeStatus,T> setter,
Function<byte[],T> transformer)
T transformedValue = transformer.apply(value);
setter.accept(nodeStatus, transformedValue);
(If value
can be something other than byte[]
, you can replace it with another type parameter.)
P.s.: setter
is a BiConsumer
, because you use a static method reference (e.g. NodeStatus::setErrorCode
) on an instance method, so the first argument of BiConsumer
has to be the NodeStatus
instance setErrorCode()
will be called on.
P.p.s: As pointed out by glglgl, you can potentially simplify your code to this:
public <T> void set (byte [] value,
Consumer<T> setter,
Function<byte[],T> transformer)
T transformedValue = transformer.apply(value);
setter.accept(transformedValue);
And call it like this:
set(status, nodeStatus::setStatus, Status::valueOf);
...where nodeStatus
is the instance of NodeStatus
you want to manipulate.
As far as I can tell, what you need is this:
public <T> void set (NodeStatus nodeStatus,
byte [] value,
BiConsumer<NodeStatus,T> setter,
Function<byte[],T> transformer)
T transformedValue = transformer.apply(value);
setter.accept(nodeStatus, transformedValue);
(If value
can be something other than byte[]
, you can replace it with another type parameter.)
P.s.: setter
is a BiConsumer
, because you use a static method reference (e.g. NodeStatus::setErrorCode
) on an instance method, so the first argument of BiConsumer
has to be the NodeStatus
instance setErrorCode()
will be called on.
P.p.s: As pointed out by glglgl, you can potentially simplify your code to this:
public <T> void set (byte [] value,
Consumer<T> setter,
Function<byte[],T> transformer)
T transformedValue = transformer.apply(value);
setter.accept(transformedValue);
And call it like this:
set(status, nodeStatus::setStatus, Status::valueOf);
...where nodeStatus
is the instance of NodeStatus
you want to manipulate.
edited Mar 7 at 13:24
answered Mar 7 at 13:13
biziclopbiziclop
41.7k126491
41.7k126491
2
OP didn't specify if that's allowed for him, but if so, I'd refine this topublic <T> void set (byte [] value, Consumer<T> setter, Function<byte[],T> transformer) T transformedValue = transformer.apply(value); setter.accept(transformedValue);
, including the status object into the setter method reference. The calls then be likeset(status, nodeStatus::setStatus, Status::valueOf); set(errorCode, nodeStatus::setErrorCode, ErrorCode::valueOf);
– glglgl
Mar 7 at 13:20
2
@glglgl You're absolutely right, that would look a lot cleaner. I just went with the signature OP provided, but I'll edit my answer.
– biziclop
Mar 7 at 13:22
Thanks everyone - Such a quick response and excellent use of generics
– Nishant Lakhara
Mar 7 at 13:52
add a comment |
2
OP didn't specify if that's allowed for him, but if so, I'd refine this topublic <T> void set (byte [] value, Consumer<T> setter, Function<byte[],T> transformer) T transformedValue = transformer.apply(value); setter.accept(transformedValue);
, including the status object into the setter method reference. The calls then be likeset(status, nodeStatus::setStatus, Status::valueOf); set(errorCode, nodeStatus::setErrorCode, ErrorCode::valueOf);
– glglgl
Mar 7 at 13:20
2
@glglgl You're absolutely right, that would look a lot cleaner. I just went with the signature OP provided, but I'll edit my answer.
– biziclop
Mar 7 at 13:22
Thanks everyone - Such a quick response and excellent use of generics
– Nishant Lakhara
Mar 7 at 13:52
2
2
OP didn't specify if that's allowed for him, but if so, I'd refine this to
public <T> void set (byte [] value, Consumer<T> setter, Function<byte[],T> transformer) T transformedValue = transformer.apply(value); setter.accept(transformedValue);
, including the status object into the setter method reference. The calls then be like set(status, nodeStatus::setStatus, Status::valueOf); set(errorCode, nodeStatus::setErrorCode, ErrorCode::valueOf);
– glglgl
Mar 7 at 13:20
OP didn't specify if that's allowed for him, but if so, I'd refine this to
public <T> void set (byte [] value, Consumer<T> setter, Function<byte[],T> transformer) T transformedValue = transformer.apply(value); setter.accept(transformedValue);
, including the status object into the setter method reference. The calls then be like set(status, nodeStatus::setStatus, Status::valueOf); set(errorCode, nodeStatus::setErrorCode, ErrorCode::valueOf);
– glglgl
Mar 7 at 13:20
2
2
@glglgl You're absolutely right, that would look a lot cleaner. I just went with the signature OP provided, but I'll edit my answer.
– biziclop
Mar 7 at 13:22
@glglgl You're absolutely right, that would look a lot cleaner. I just went with the signature OP provided, but I'll edit my answer.
– biziclop
Mar 7 at 13:22
Thanks everyone - Such a quick response and excellent use of generics
– Nishant Lakhara
Mar 7 at 13:52
Thanks everyone - Such a quick response and excellent use of generics
– Nishant Lakhara
Mar 7 at 13:52
add a comment |
It's a little unclear what you're trying to achieve. Why pass the NodeStatus and the function when you could just pass a function that works on that specific NodeStatus instance, e.g.:
static <T> void set(byte[] status, Consumer<T> nodeStatusOperator, Function<String, T> transformer)
nodeStatusOperator.accept(transformer.apply(new String(status)));
public static void main(String[] args)
NodeStatus nodeStatus = new NodeStatus();
byte[] status = new byte[0];
set(status, nodeStatus::setStatus, Status::valueOf);
set(status, nodeStatus::setErrorCode, ErrorCode::valueOf);
And what does that genericity buy you over a more straightforward approach?
nodeStatus.setStatus(Status.valueOf(new String(status)));
nodeStatus.setErrorCode(ErrorCode.valueOf(new String(status)));
new String(status) is common for all Enums. Similarly in my class there are multiple other setters like Date where conversion is different. Also there are string setters. Moreover I can apply some general checks on the transformed value for multiple setters of same type and thus reduce line of code. Example: nodeStatus.setUpdateTs(new Date(BinaryUtils.bytesToLong(updateTs))
– Nishant Lakhara
Mar 7 at 13:56
add a comment |
It's a little unclear what you're trying to achieve. Why pass the NodeStatus and the function when you could just pass a function that works on that specific NodeStatus instance, e.g.:
static <T> void set(byte[] status, Consumer<T> nodeStatusOperator, Function<String, T> transformer)
nodeStatusOperator.accept(transformer.apply(new String(status)));
public static void main(String[] args)
NodeStatus nodeStatus = new NodeStatus();
byte[] status = new byte[0];
set(status, nodeStatus::setStatus, Status::valueOf);
set(status, nodeStatus::setErrorCode, ErrorCode::valueOf);
And what does that genericity buy you over a more straightforward approach?
nodeStatus.setStatus(Status.valueOf(new String(status)));
nodeStatus.setErrorCode(ErrorCode.valueOf(new String(status)));
new String(status) is common for all Enums. Similarly in my class there are multiple other setters like Date where conversion is different. Also there are string setters. Moreover I can apply some general checks on the transformed value for multiple setters of same type and thus reduce line of code. Example: nodeStatus.setUpdateTs(new Date(BinaryUtils.bytesToLong(updateTs))
– Nishant Lakhara
Mar 7 at 13:56
add a comment |
It's a little unclear what you're trying to achieve. Why pass the NodeStatus and the function when you could just pass a function that works on that specific NodeStatus instance, e.g.:
static <T> void set(byte[] status, Consumer<T> nodeStatusOperator, Function<String, T> transformer)
nodeStatusOperator.accept(transformer.apply(new String(status)));
public static void main(String[] args)
NodeStatus nodeStatus = new NodeStatus();
byte[] status = new byte[0];
set(status, nodeStatus::setStatus, Status::valueOf);
set(status, nodeStatus::setErrorCode, ErrorCode::valueOf);
And what does that genericity buy you over a more straightforward approach?
nodeStatus.setStatus(Status.valueOf(new String(status)));
nodeStatus.setErrorCode(ErrorCode.valueOf(new String(status)));
It's a little unclear what you're trying to achieve. Why pass the NodeStatus and the function when you could just pass a function that works on that specific NodeStatus instance, e.g.:
static <T> void set(byte[] status, Consumer<T> nodeStatusOperator, Function<String, T> transformer)
nodeStatusOperator.accept(transformer.apply(new String(status)));
public static void main(String[] args)
NodeStatus nodeStatus = new NodeStatus();
byte[] status = new byte[0];
set(status, nodeStatus::setStatus, Status::valueOf);
set(status, nodeStatus::setErrorCode, ErrorCode::valueOf);
And what does that genericity buy you over a more straightforward approach?
nodeStatus.setStatus(Status.valueOf(new String(status)));
nodeStatus.setErrorCode(ErrorCode.valueOf(new String(status)));
answered Mar 7 at 13:24
MikeFHayMikeFHay
3,23032035
3,23032035
new String(status) is common for all Enums. Similarly in my class there are multiple other setters like Date where conversion is different. Also there are string setters. Moreover I can apply some general checks on the transformed value for multiple setters of same type and thus reduce line of code. Example: nodeStatus.setUpdateTs(new Date(BinaryUtils.bytesToLong(updateTs))
– Nishant Lakhara
Mar 7 at 13:56
add a comment |
new String(status) is common for all Enums. Similarly in my class there are multiple other setters like Date where conversion is different. Also there are string setters. Moreover I can apply some general checks on the transformed value for multiple setters of same type and thus reduce line of code. Example: nodeStatus.setUpdateTs(new Date(BinaryUtils.bytesToLong(updateTs))
– Nishant Lakhara
Mar 7 at 13:56
new String(status) is common for all Enums. Similarly in my class there are multiple other setters like Date where conversion is different. Also there are string setters. Moreover I can apply some general checks on the transformed value for multiple setters of same type and thus reduce line of code. Example: nodeStatus.setUpdateTs(new Date(BinaryUtils.bytesToLong(updateTs))
– Nishant Lakhara
Mar 7 at 13:56
new String(status) is common for all Enums. Similarly in my class there are multiple other setters like Date where conversion is different. Also there are string setters. Moreover I can apply some general checks on the transformed value for multiple setters of same type and thus reduce line of code. Example: nodeStatus.setUpdateTs(new Date(BinaryUtils.bytesToLong(updateTs))
– Nishant Lakhara
Mar 7 at 13:56
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55044589%2fjava-8-functional-programming-need-to-write-a-generic-function-on-class%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown